package stack

import (
	"errors"
)

// 在练习 10.16 和 10.17 中我们开发了一些栈结构类型。但是它们被限制为某种固定的内建类型。现在用一个元素类型是 interface{}（空接口）的切片开发一个通用的栈类型。

// 实现下面的栈方法：

// Len() int
// IsEmpty() bool
// Push(x interface{})
// Pop() (interface{}, error)

// Pop() 改变栈并返回最顶部的元素；Top() 只返回最顶部元素。

// 在主程序中构建一个充满不同类型元素的栈，然后弹出并打印所有元素的值。

type Any interface{}

type StackAny []Any

func (s StackAny) Len() int {
	return len(s)
}

func (s StackAny) IsEmpty() bool {
	return s.Len() == 0
}

func (s *StackAny) Push(x Any) {
	*s = append(*s, x)
}

func (s StackAny) Top() (Any, error) {
	if len(s) == 0 {
		return nil, errors.New("stack is empty")
	}
	return s[len(s)-1], nil
}

func (s *StackAny) Pop() (top Any, err error) {
	stk := *s
	err = nil
	if len(stk) == 0 {
		top = nil
		err = errors.New("Stack is empty")
		return
	}
	*s, top = stk[:len(stk)-1], stk[len(stk)-1]
	return
}
